import imageCompression from 'browser-image-compression';
function _compressedImage(img,size, noResizeWidthHeight, quality) {
	// let statTime = new Date().getTime()
  const canvas = document.createElement("canvas")
  const ct = canvas.getContext("2d")
  let originWidth = img.width
  let originHeight = img.height
  let maxWidth = 1920
  let maxHeight = 1920
  let canvasWidth = originWidth
  let canvasHeight = originHeight
  if(!noResizeWidthHeight) {
    // 如果原始图片的宽度或高度超过了设定的最大宽度或高度，则进行缩放处理
    if (originWidth > maxWidth || originHeight > maxHeight) {
      // 如果原始图片的宽高比大于目标宽高比，说明图片更宽，按照宽度限定尺寸
      if (originWidth / originHeight > maxWidth / maxHeight) {
        canvasWidth = maxWidth // 设置目标宽度为最大宽度
        canvasHeight = Math.round(maxWidth * (originHeight / originWidth)) // 根据宽度比例计算目标高度，并四舍五入
      } else {
        // 如果原始图片的宽高比小于或等于目标宽高比，说明图片更高，按照高度限定尺寸
        canvasHeight = maxHeight // 设置目标高度为最大高度
        canvasWidth = Math.round(maxHeight * (originWidth / originHeight)) // 根据高度比例计算目标宽度，并四舍五入
      }
    }
  }
  canvas.width = canvasWidth
  canvas.height = canvasHeight
  ct.drawImage(img, 0, 0, canvasWidth, canvasHeight)
  // const dataUrl = canvas.toDataURL("image/jpeg", size>10?0.5:size>6?0.3:0.2)
  const dataUrl = canvas.toDataURL("image/jpeg", quality ? quality : 0.92)
	// let endTime = new Date().getTime() - statTime
	// console.log('toDataURLTime:', endTime)
	let fileSize = getBase64ImageSize(dataUrl)
	console.log('fileSize:', fileSize / 1024 / 1024 + 'Mb')
  return dataUrl;
}

// 计算base64编码图片大小
function getBase64ImageSize(base64) {
	const indexBase64 = base64.indexOf('base64,')
	if (indexBase64 < 0) return -1
	const str = base64.substr(indexBase64 + 6)
	// 大小单位：字节
	return (str.length * 0.75).toFixed(2)
}

function readFile(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader(file)
    reader.readAsDataURL(file)
    reader.onload = () => {
      const content = reader.result
      const img = new Image()
      img.src = content
      resolve(img)
    }
  })
}
 
function loadImg(img) {
  return new Promise((resolve, reject) => {
    img.onload = () => {
      resolve(img)
    }
    img.onerror =  () => {
      reject(img)
    }
  })
}

// 图片压缩
function compressImage(filesObj, needCompress, size) {
  console.log('compressImage压缩')
  return new Promise((resolve, reject) => {
    if(needCompress) {
      readFile(filesObj.originalFileObj)
      .then(img => {
        return loadImg(img)
      })
      .catch(err=>{
        reject(err)
      })
      .then(img => {
        resolve({
          path: _compressedImage(img, size, false)
        })
      })
    } else {
      console.log('不需要压缩')
      resolve({
        path: filesObj.path || URL.createObjectURL(filesObj.originalFileObj)
      })
    }
  })
}
/**
 * 压缩图片
 * @param {*} compressType 压缩类型 1：ocr相关（人脸，身份证识别、银行卡）2：普通压缩  3: 不压缩
 * @param {*} needCompress 是否需要压缩
 * @param {*} filesObj 图片文件对象
 * @param {*} size 文件大小（M）
 * @param {*} isByPluginCompress 是否采用插件压缩 true 插件压缩 false 自己写代码压缩
 * @returns 
 */
export function compressImageByPlugin(compressType, needCompress, filesObj, size, isByPluginCompress) {
  if(!isByPluginCompress) {
    return compressImage(filesObj, needCompress, size)
  }
  const options = {
    useWebWorker: true, // 使用 Web Worker 进行压缩
    libURL: '/src/utils/lib/browser-image-compression.js' // 导入Web Worker脚本的库URL,修改为本地路径
  }
  if(compressType == 1) {
    options.initialQuality = 0.92
    // options.maxSizeMB = 1 // 最大文件大小（MB）
    options.maxWidthOrHeight = 1920 // 最大宽度或高度
  } else if(compressType == 2) {
    options.initialQuality = 0.92
    options.maxWidthOrHeight = 1920 // 最大宽度或高度
    // options.maxSizeMB = 2 // 最大文件大小（MB）
  } else {}
  console.log('压缩参数：', options)
  return new Promise((resolve, reject) => {
    if(needCompress) {
      console.log('需要压缩')
      imageCompression(filesObj.originalFileObj, options)
        .then((compressedFile) => {
          console.log(`compressedFile size ${compressedFile.size / 1024 / 1024} MB`); // smaller than maxSizeMB
          resolve({
            path: URL.createObjectURL(compressedFile)
          })
        })
        .catch((error) => {
          console.log(error);
          // reject(error)
          // 如果压缩失败，则采用原图片
          resolve({
            path: filesObj.path || URL.createObjectURL(filesObj.originalFileObj)
          })
        });
    } else {
      console.log('不需要压缩')
      resolve({
        path: filesObj.path || URL.createObjectURL(filesObj.originalFileObj)
      })
    }
  })
}
// 图片压缩
export function compressImageByUrl(url, compressType, isByPluginCompress) {
  return imageUrlToFile(url, '临时文件').then(file => {
    let size = file.size / 1024 / 1024 
    console.log('链接转文件大小:', size + 'MB');
    // 3 不压缩，1 大于2M压缩，2大于2M压缩
    let needCompress = ((compressType == 1 || compressType == 2) && size > 2)
    console.log('支付宝图片是否需要压缩:', needCompress)
    return compressImageByPlugin(compressType, needCompress, {
      originalFileObj: file
    }, size, isByPluginCompress)
  }).catch(error => {
    reject('将图片链接转换为File对象失败');
    // 处理错误
  });
}
// 将图片链接转换为File对象
async function imageUrlToFile(imageUrl, fileName) {
  try {
    // 从图片链接获取图片数据
    const response = await fetch(imageUrl);
    if (!response.ok) {
        throw new Error(`Failed to fetch image: ${response.statusText}`);
    }
    const arrayBuffer = await response.arrayBuffer();
    // 将图片数据转换为Blob对象
    const blob = new Blob([new Uint8Array(arrayBuffer)], { type: response.headers.get('content-type') });
    // 使用Blob对象创建一个File对象
    const file = new File([blob], fileName, { type: blob.type });
    return file;
  } catch (error) {
    console.error('将图片链接转换为File对象时发生错误:', error);
    throw error;
  }
}
export default compressImage